package com.kamistoat.meimeimall.meimeimallgateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsConfigurationSource;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.server.ServerWebExchange;

/**
 * 为当前服务配置跨域。
 * 由于项目所有的请求都是从网关模块进入的，因此配置了网关就相当于为所有模块开放了跨域
 */
@Configuration
public class CorsConfig {

    // 配置CorsWebFilter并注入到容器中。CorsWebFilter类是库类，会被添加到请求过滤器链中。
    @Bean
    public CorsWebFilter corsWebFilter(){
        // 基础跨域配置类UrlBasedCorsConfigurationSource。同样位于reactive包下
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        // 基础跨域配置类UrlBasedCorsConfigurationSource，需要传入一个高级跨域配置类CorsConfiguration作为参数
        CorsConfiguration corsConfiguration = new CorsConfiguration();

        // 下面开始配置 高级跨域配置类:
        // 允许所有的Header进行跨域访问
        corsConfiguration.addAllowedHeader("*");
        // 允许所有的Http方式进行跨域访问
        corsConfiguration.addAllowedMethod("*");
        // 允许所有的请求来源进行跨域访问
        corsConfiguration.addAllowedOriginPattern("*");
        // 允许携带cookie进行跨域请求，否则丢失cookie信息
        corsConfiguration.setAllowCredentials(true);

        // 将 高级跨域配置类 作为参数传入 基础跨域配置类  的  注册跨域配置  方法中
        // 方法的第一个参数是一个路径，该路径将会应用传入的 高级跨域配置
        // 这里直接设置为所有的路径都应用
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsWebFilter(urlBasedCorsConfigurationSource);
    }
}
